package com.zhejiangzhengyuan.municipal_common.utils.excelFileUtils;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;

import com.alibaba.excel.EasyExcel;
import com.zhejiangzhengyuan.municipal_common.response.ResponseVo;
import com.zhejiangzhengyuan.municipal_common.utils.ConstantUtil;
import org.apache.logging.log4j.util.Strings;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

/**
 * Excel 工具类
 *
 * @author lin_ju
 * @since 2019/11/29
 */
public class ExcelUtil {
  /**
   * 根据class 生成excel,并存放在服务器端
   *
   * @param fileName 文件名也是sheet名
   * @param clazz 需要生成excel的类
   * @param datas 导出的数据
   */
  public static String objectToExcel(String fileName, Class clazz, List<?> datas) {
    String filePath = FileUtil.CLASSPATH + fileName + System.currentTimeMillis() + ".xlsx";
    // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
    EasyExcel.write(filePath, clazz).sheet(fileName).doWrite(datas);
    return filePath;
  }

  /**
   * 根据class 生成excel,并存放在服务器端
   *
   * @param fileName 文件名也是sheet名
   * @param clazz 需要生成excel的类
   * @param datas 导出的数据
   */
  public static String objectToExcelAndDownload(
      HttpServletResponse response, String fileName, Class clazz, List<?> datas) {
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
    try {
      fileName = URLEncoder.encode(fileName, "UTF-8");
      response.setHeader(
          "Content-disposition",
          "attachment;filename=" + fileName + System.currentTimeMillis() + ".xlsx");
      // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
      EasyExcel.write(response.getOutputStream(), clazz).sheet(fileName).doWrite(datas);
      return "success";
    } catch (IOException e) {
      e.printStackTrace();
      return e.getMessage();
    }
  }


  /**
   * 根据class 生成excel,并存放在服务器端
   *
   * @param fileName 文件名也是sheet名
   * @param clazz 需要生成excel的类
   * @param exclude 需要忽略的字段的集合
   * @param datas 导出的数据
   */
  public static void objectToExcelAndDownload(
          HttpServletResponse response,Set<String> exclude, String fileName, Class clazz, List<?> datas) {
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
    try {
      fileName = URLEncoder.encode(fileName, "UTF-8");
      response.setHeader(
              "Content-disposition",
              "attachment;filename=" + fileName + System.currentTimeMillis() + ".xlsx");
      // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
      EasyExcel.write(response.getOutputStream(), clazz).excludeColumnFiledNames(exclude).sheet(fileName).doWrite(datas);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }


  /**
   * @param file http请求携带的文件
   * @return 统一封装返回值
   */
  public static ResponseVo readExcel(MultipartFile file, Class clazz, ExcelResolveListener excelResolveListener) {
    // 判断文件是否存在
    if (Objects.isNull(file) || file.isEmpty()) {
      return new ResponseVo(ConstantUtil.HTTP_CODE.CLIENT_PARAM_ERROR, "请提供file文件，key为 'file'");
    }

    // 获取文件后缀
    String fileName = file.getOriginalFilename();
    if (Strings.isBlank(fileName) || !fileName.endsWith("xlsx")) {
      return new ResponseVo(
          ConstantUtil.HTTP_CODE.CLIENT_PARAM_ERROR, "file文件请修改为 xlsx 新版 excel格式");
    }

    try {
      EasyExcel.read(file.getInputStream(), clazz,excelResolveListener)
          .sheet()
          .doRead();
    } catch (IOException e) {
      e.printStackTrace();
      return ResponseVo.errorWithException(e);
    }
    return ResponseVo.SUCCESS;
  }
}
